home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 June: Reference Library / Dev.CD Jun 00 RL Disk 1.toast / pc / technical documentation / develop / develop issue 26 / develop issue 26 code / qt conferencing code / watcher & 'caster / watching.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-02  |  14.2 KB  |  553 lines

  1. #include "watching.h"
  2. #include "shared.h"
  3.  
  4. /* Local Prototypes ********************************/
  5. ComponentResult     HandleConferenceEvent ( MTConferenceEventPtr confEvent );
  6. ComponentResult     DoMemberJoining( MTConferenceEventPtr    confEvent );
  7. ComponentResult     DoConfReady( MTConferenceEventPtr    confEvent );
  8. ComponentResult     DoMemberReady( MTConferenceEventPtr    confEvent );
  9. ComponentResult     DoMemberTerminated( MTConferenceEventPtr    confEvent );
  10. ComponentResult     DoPhoneRinging( MTConferenceEventPtr    confEvent );
  11. ComponentResult     DisposeConference( ConferenceRecord* conf );
  12. ComponentResult     DisposeMemberRecord( MemberRecord* member );
  13. ComponentResult     NewConference( ConferenceRecord** conf );
  14. ComponentResult     NewMember( MemberRecord** member );
  15. void                 AddMember( ConferenceRecord* conf, MemberRecord* member );
  16. void                RemoveMember( ConferenceRecord* conf, MemberRecord* member );
  17. MemberRecord*        FindMember( ConferenceRecord* conf, MTConferenceMember who );
  18. MemberRecord*        FindMemberWindow( ConferenceRecord* conf, WindowPtr wind );
  19. pascal Boolean         MyControllerActionFilter(MTControllerComponent mtc, MTControllerActionType action, void *params, long refCon);
  20.  
  21.  
  22. /* globals *****************************************/
  23. ConferenceRecord* gConference;    /* the conference  */
  24.  
  25. MTControllerActionFilterUPP    actionFilterUPP = NewMTControllerActionFilterProc(MyControllerActionFilter);
  26.     
  27. /*************************************************** 
  28.  CreateWatchConference 
  29. ****************************************************/
  30. ComponentResult CreateWatchConference( Str63 userName ) {
  31.  
  32.     ComponentResult err;
  33.     MTCString63        cUserName;
  34.     
  35.     /* convert the to the funky MTCString format */
  36.     PToCString( userName, cUserName );
  37.  
  38.     /* creates a conference record */
  39.     err = NewConference( &gConference );
  40.     if (err == noErr) {
  41.     
  42.         gConference->confComponent = OpenDefaultComponent(kMTConferenceType, kMTMovieTalkSubType );
  43.         
  44.         if (gConference->confComponent)
  45.             {
  46.             /* tell the conference component that we only wish to receive media, not send */
  47.             err = MTConferenceSetMode(gConference->confComponent, mtReceiveMediaModeMask);
  48.             
  49.             /* tell the conference component to prepare to use AppleTalk. */
  50.             /* the funky string tells the conference component to:
  51.                 mtlk = use the MovieTalk transport component
  52.                 atlk = use the AppleTalk network component
  53.                 NoIncomingCalls = the AppleTalk specific NBP type that is used for listening,
  54.                  i.e. there will be no incoming calls 
  55.             */
  56.             if (err == noErr)
  57.                 err = MTConferenceListen(gConference->confComponent, cUserName, cUserName, (MTCString)"mtlkatlk\tNoIncomingCalls\x0D");
  58.             }
  59.         else
  60.             err = couldntGetRequiredComponent;
  61.         }
  62.     return err;
  63. }
  64.     
  65. /*************************************************** 
  66.  CallMember 
  67. ****************************************************/
  68. ComponentResult CallMember( MTName* name, 
  69.                             WindowPtr wind, 
  70.                             Rect* box, 
  71.                             Boolean resize, 
  72.                             MemberRecord** member ) {
  73.  
  74.     MemberRecord* mr;
  75.     ComponentResult err;
  76.  
  77.     /* create a new member record */
  78.     err = NewMember( &mr );
  79.     
  80.     if (err == noErr) {
  81.  
  82.         mr->member = MTConferenceCall(gConference->confComponent, 
  83.                                       (MTCString)"Watcher", name);
  84.     
  85.         mr->box = *box;
  86.         
  87.         mr->window = wind;
  88.         
  89.         mr->resize = resize;
  90.     
  91.         if (member)
  92.             *member = mr;
  93.             
  94.         AddMember( gConference, mr );
  95.         }
  96.         
  97.     return err;
  98. }
  99.  
  100. /*************************************************** 
  101.  SaveWatch 
  102. ****************************************************/
  103. void SaveWatch( void ) {
  104.  
  105. }
  106.  
  107. /*************************************************** 
  108.  CloseWatch 
  109. ****************************************************/
  110. ComponentResult CloseWatch( WindowPtr window ) {
  111.  
  112.     ComponentResult     err = noErr;
  113.     MTConferenceToken     theConference;
  114.     MemberRecord*        theMember;
  115.     
  116.     theMember = FindMemberWindow( gConference, window );
  117.     
  118.     if (theMember == nil)
  119.         err = paramErr;
  120.     
  121.     if (err == noErr)
  122.         {
  123.         theConference = MTConferenceGetMemberConference(gConference->confComponent, theMember->member);
  124.         err = MTConferenceTerminate(gConference->confComponent, theConference);
  125.         }
  126.     return err;
  127. }
  128.  
  129. /*************************************************** 
  130.  GetWatchInfo 
  131. ****************************************************/
  132. void GetWatchInfo( void ) {
  133.  
  134. }
  135.  
  136. /*************************************************** 
  137.  DoCopy 
  138. ****************************************************/
  139. void DoCopy( void ) {
  140.  
  141. }
  142.  
  143. /*************************************************** 
  144.  IsWatchWindow 
  145. ****************************************************/
  146. Boolean IsWatchWindow( WindowPtr window ) {
  147.     Boolean isWatch = false;
  148.     MemberRecord* mr = gConference->memberHead;
  149.     
  150.     while (mr != nil)
  151.         {
  152.         if (mr->window == window)
  153.             {
  154.             isWatch = true;
  155.             break;
  156.             }
  157.         mr = mr->next;
  158.         }
  159.     
  160.     return isWatch;    
  161. }
  162.  
  163. /*************************************************** 
  164.  HandleConferenceEvent 
  165. ****************************************************/
  166. ComponentResult HandleConferenceEvent ( MTConferenceEventPtr confEvent ){
  167.  
  168.     ComponentResult err = noErr;
  169.     
  170.     /* like a user event handler, we switch on the different conference events */
  171.     switch(confEvent->what){
  172.         case mtConferenceReadyEvent:
  173.             err = DoConfReady(confEvent);
  174.             break;
  175.         
  176.         case mtMemberReadyEvent:
  177.             err = DoMemberReady(confEvent);
  178.             break;
  179.         
  180.         case mtMemberTerminatedEvent:
  181.             err = DoMemberTerminated(confEvent);
  182.             break;
  183.         
  184.         case mtMemberJoiningEvent:
  185.             err = DoMemberJoining(confEvent);
  186.             break;
  187.             
  188.         case mtPhoneRingingEvent:
  189.             err = DoPhoneRinging(confEvent);
  190.             break;
  191.         
  192.         case mtRefusedEvent:
  193.             err = confEvent->err;
  194.             break;
  195.         
  196.         case mtFailedEvent:
  197.             err = confEvent->err;
  198.             break;
  199.             
  200.         default:
  201.             /* ignore all others */
  202.             break;
  203.         }
  204.     
  205.     if(confEvent->surprise)
  206.         DisposeHandle(confEvent->surprise);
  207.         
  208.     return err;
  209. }
  210.  
  211. /*************************************************** 
  212.  DoMemberJoining 
  213. ****************************************************/
  214. ComponentResult DoMemberJoining( MTConferenceEventPtr    confEvent ){
  215.     MemberRecord*        currMember;
  216.     ComponentResult     err = noErr;
  217.  
  218.     err = NewMember( &currMember);
  219.     if (err != nil) {
  220.         currMember->member = confEvent->who;
  221.         AddMember( gConference, currMember );
  222.         }
  223.     return err;
  224. }
  225.  
  226. /*************************************************** 
  227.  DoConfReady 
  228. ****************************************************/
  229. ComponentResult DoConfReady( MTConferenceEventPtr    confEvent ){
  230.  
  231.     return MTConferenceActivateConference(gConference->confComponent, confEvent->who, 0);
  232.     
  233. }
  234.  
  235. /*************************************************** 
  236.  DoMemberReady 
  237. ****************************************************/
  238. ComponentResult DoMemberReady( MTConferenceEventPtr    confEvent ){
  239.  
  240.     ComponentResult            err = noErr;
  241.     MemberRecord*            currMember;
  242.     Rect                    box = { 100, 100, 220, 260     };
  243.     Point                    where = { 0, 0 };
  244.     Str255                    windowName;
  245.     Boolean                    aFalse = false;
  246.     
  247.     if (confEvent->bonus & mtReceiveMediaModeMask) {    
  248.  
  249.         currMember = FindMember(gConference, confEvent->who);
  250.  
  251.         if (currMember == nil)
  252.             return noErr;
  253.         
  254.         currMember->controller = OpenDefaultComponent( kMTControllerType, kMTMovieTalkSubType );
  255.  
  256.         if (currMember->controller == 0)
  257.             err = couldntGetRequiredComponent;
  258.  
  259.         currMember->director = OpenDefaultComponent(kMTSinkStreamDirectorType, kMTPlayerType);
  260.  
  261.         if (currMember->director == 0)
  262.             err = couldntGetRequiredComponent;
  263.     
  264.         if (err == noErr)
  265.             err = MTControllerSetActionFilter(currMember->controller, actionFilterUPP, (long)currMember);
  266.  
  267.         if (err == noErr)
  268.             err = MTControllerNewAttachedController(currMember->controller, currMember->director, 
  269.                                                     currMember->window, where);
  270.         if (err == noErr)    
  271.             err = MTControllerDoAction( currMember->controller, mtControllerActionSetShowSnapshot, &aFalse );
  272.  
  273.         if (err == noErr)
  274.             err = MTConferenceActivateMember(gConference->confComponent, confEvent->who, currMember->controller);
  275.  
  276.         GetMemberName( currMember, windowName );
  277.         SetWTitle(currMember->window, windowName );
  278.  
  279.     }
  280.         
  281.     return err;
  282. }
  283.  
  284. /*************************************************** 
  285.  DoMemberTerminated 
  286. ****************************************************/
  287. ComponentResult DoMemberTerminated( MTConferenceEventPtr    confEvent ){
  288.     MemberRecord*                member;
  289.     ComponentResult                err;
  290.     
  291.     member = FindMember(gConference, confEvent->who);
  292.     
  293.     if(member == nil)
  294.         return noErr;
  295.         
  296.     RemoveMember( gConference, member );
  297.     
  298.     if(member->controller)
  299.         CloseComponent( member->controller);
  300.     
  301.     if (member->director)
  302.         CloseComponent( member->director);
  303.     
  304.     if (member->window)
  305.         CloseWindow( member->window);
  306.  
  307.     err = DisposeMemberRecord( member );
  308.         
  309.     return err;
  310. }
  311.  
  312. /*************************************************** 
  313.  DoPhoneRinging 
  314. ****************************************************/
  315. ComponentResult DoPhoneRinging( MTConferenceEventPtr    confEvent ){
  316.  
  317.     ComponentResult            err = noErr;
  318.     MTConferenceEventPtr    unused = confEvent;
  319.     
  320.     return err;
  321. }
  322.  
  323. /*************************************************** 
  324.  TearDown 
  325. ****************************************************/
  326. void TearDownWatch( void ) {
  327.     /* close the conference component if there is one */
  328.     if (gConference->confComponent)
  329.         CloseComponent(gConference->confComponent);
  330. }
  331.  
  332. /*************************************************** 
  333.  IsConferenceEvent 
  334. ****************************************************/
  335. Boolean IsConferenceEvent( EventRecord* theEvent ) {
  336.  
  337.     ComponentResult err = noErr; 
  338.     Boolean            handled = false;
  339.     MemberRecord*     member = gConference->memberHead;
  340.     
  341.     while ((member != nil) && (handled != true))
  342.         {
  343.         handled = MTControllerIsControllerEvent (member->controller,  theEvent );
  344.         member = member->next;
  345.         }
  346.  
  347.     return handled;
  348. }
  349.  
  350. /*************************************************** 
  351.  CheckConferenceEvents 
  352. ****************************************************/
  353. ComponentResult CheckConferenceEvents( void ) {
  354.  
  355.     MTConferenceEvent confEvent;
  356.     ComponentResult err = noErr; 
  357.     
  358.     if( MTConferenceGetNextEvent( gConference->confComponent, &confEvent ) )
  359.         err = HandleConferenceEvent(&confEvent);
  360.     
  361.     return err;
  362. }
  363.  
  364. /*************************************************** 
  365.  NewMember 
  366. ****************************************************/
  367. ComponentResult NewMember( MemberRecord** member ) {
  368.  
  369.     *member = (MemberRecord*)NewPtrClear( sizeof( MemberRecord));
  370.  
  371.     return MemError();
  372. }
  373.  
  374. /*************************************************** 
  375.  NewConference
  376. ****************************************************/
  377. ComponentResult NewConference( ConferenceRecord** conf ) {
  378.  
  379.     *conf = (ConferenceRecord*)NewPtrClear( sizeof( ConferenceRecord) );
  380.  
  381.     return MemError();
  382. }
  383.  
  384. /*************************************************** 
  385.  DisposeMemberRecord 
  386. ****************************************************/
  387. ComponentResult     DisposeMemberRecord( MemberRecord* member ) {
  388.         
  389.     DisposePtr( (Ptr)member );
  390.  
  391.     return MemError();
  392. }
  393.  
  394. /*************************************************** 
  395.  DisposeConference 
  396. ****************************************************/
  397. ComponentResult     DisposeConference( ConferenceRecord* conf ) {
  398.  
  399.     DisposePtr( (Ptr)conf );
  400.  
  401.     return MemError();
  402. }
  403.  
  404. /*************************************************** 
  405.  AddMember 
  406. ****************************************************/
  407. void     AddMember( ConferenceRecord* conf, MemberRecord* member ) {
  408.  
  409.     MemberRecord*  oldHead;
  410.     
  411.     oldHead = conf->memberHead;
  412.  
  413.     conf->memberHead = member;
  414.  
  415.     member->next = oldHead;
  416.  
  417. }
  418.  
  419. /*************************************************** 
  420.  RemoveMember 
  421. ****************************************************/
  422. void    RemoveMember( ConferenceRecord* conf, MemberRecord* member ) {
  423.  
  424.     MemberRecord** prevHead = &conf->memberHead;
  425.     MemberRecord*  oldHead = conf->memberHead;
  426.     
  427.     while ( oldHead != nil ) {
  428.         if ( oldHead == member )
  429.             {
  430.             *prevHead = oldHead->next;
  431.             break;
  432.             }
  433.         prevHead = &oldHead->next;
  434.         oldHead = oldHead->next;
  435.         }        
  436. }
  437.  
  438. /*************************************************** 
  439.  FindMember 
  440. ****************************************************/
  441. MemberRecord*    FindMember( ConferenceRecord* conf, MTConferenceMember who ) {
  442.     
  443.     MemberRecord* foundMember = nil;
  444.     MemberRecord* currMember = conf->memberHead;
  445.     
  446.     while (currMember != nil) {
  447.  
  448.         if (currMember->member == who)
  449.             {
  450.             foundMember = currMember;
  451.             break;
  452.             }
  453.             
  454.         currMember = currMember->next;
  455.     } 
  456.     
  457.     return foundMember;
  458. }
  459.  
  460. /*************************************************** 
  461.  FindMemberWindow 
  462. ****************************************************/
  463. MemberRecord*    FindMemberWindow( ConferenceRecord* conf, WindowPtr wind ) {
  464.     
  465.     MemberRecord* foundMember = nil;
  466.     MemberRecord* currMember = conf->memberHead;
  467.     
  468.     while (currMember != nil) {
  469.  
  470.         if (currMember->window == wind)
  471.             {
  472.             foundMember = currMember;
  473.             break;
  474.             }
  475.             
  476.         currMember = currMember->next;
  477.     } 
  478.     
  479.     return foundMember;
  480. }
  481.  
  482. /*************************************************** 
  483.  GetMemberName 
  484. ****************************************************/
  485. ComponentResult GetMemberName( MemberRecord* mr, Str255 name )
  486. {
  487.     ComponentResult     err = noErr;
  488.     MTCString             confName;
  489.     int                    nameLen;
  490.  
  491.     confName =  MTConferenceGetMemberName( gConference->confComponent, mr->member);
  492.  
  493.     if (name != NULL)
  494.         {
  495.         /* poor man's ctop string copy */
  496.         for ( nameLen = 0; name[nameLen] != 0; nameLen++)
  497.             {
  498.             name[nameLen+1] = confName[nameLen];
  499.             if (nameLen > 254)
  500.                 break;
  501.             }
  502.         name[0] = nameLen;
  503.         }
  504.     else
  505.         err = paramErr;
  506.         
  507.     return err;
  508. }
  509.  
  510. /*************************************************** 
  511.  MyControllerActionFilter 
  512. ****************************************************/
  513. pascal Boolean     MyControllerActionFilter(MTControllerComponent mtc, 
  514.                                          MTControllerActionType action, 
  515.                                          void* params, long refCon ) {
  516.     void*        unused1 = params;
  517.     long        unused2 = refCon;
  518.     Boolean     handled = false;
  519.     WindowPtr    controllerWindow = (WindowPtr)MTControllerGetControllerPort(mtc);
  520.     Rect        box;
  521.  
  522.     Boolean        aTrue = true;
  523.     
  524.     switch (action)
  525.         {
  526.         case mtControllerActionControllerSizeChanged:
  527.             /* find out how big the controller is */
  528.             MTControllerGetControllerBoundsRect(mtc, &box);
  529.             /* resize the window accordingly */
  530.             SizeWindow ( controllerWindow, box.right, box.bottom, true);
  531.             /* make the window visible if it wasn't (i.e. it was just created) */
  532.             ShowWindow( controllerWindow );
  533.             
  534.             /* controller bug fix: change controller size to sync up to transmitted size */
  535.             {
  536.                 Boolean        remoteChange = (*(Boolean*)params);
  537.                 if (remoteChange)
  538.                     {
  539.                     MTControllerSetControllerBoundsRect(mtc, &box);
  540.                     }
  541.             }    
  542.             break;
  543.             
  544.         case mtControllerActionStreamsChanged:
  545.              MTControllerDoAction(mtc, mtControllerActionPlay, &aTrue);
  546.              break;
  547.  
  548.         default:
  549.             break;
  550.         }
  551.         
  552.     return handled;
  553. }